/**
 * 
 */
package bancosys.tec.persist.validator;

import java.util.List;

import bancosys.tec.persist.Persistable;

/**
 * @author fabio.sakiyama
 * @created 07/04/2011
 * @param <T> A entidade que ao ser persistida, irá executar métodos abaixo de acordo com os validators configurados.
 */
public interface Validator<T extends Persistable> {

    /**
     * Valida insert.
     * 
     * @param bean bean.
     * @return erros ou null.
     */
    List<ValidationError> validateInsert(T bean);

    /**
     * Valida update.
     * 
     * @param bean bean.
     * @return erros ou null.
     */
    List<ValidationError> validateUpdate(T bean);

    /**
     * Valida remove.
     * 
     * @param bean bean.
     * @return erros ou null.
     */
    List<ValidationError> validateRemove(T bean);

    /**
     * Valida autorização do insert.
     * 
     * @param bean bean.
     * @return erros ou null.
     */
    List<ValidationError> validateInsertAuthorization(T bean);

    /**
     * Valida autorização do update.
     * 
     * @param bean bean.
     * @return erros ou null.
     */
    List<ValidationError> validateUpdateAuthorization(T bean);

    /**
     * Valida autorização do remove.
     * 
     * @param bean bean.
     * @return erros ou null.
     */
    List<ValidationError> validateRemoveAuthorization(T bean);

    /**
     * @return Classe configurada como target para este validator através de generics.
     */
    Class<? extends T> getTargetClass();

}
